<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* ()(()) ) */
      /* 思路：遇到括号问题，肯定优先考虑栈，如果是左括号，就入栈
              右括号，就栈顶元素出栈。既然要求长度，那么入栈的是索引即可。

              但也遇到了个问题，索引0-5正好匹配完了，那么遍历到索引为6的右括号
              它既不能入栈，又不能匹配。但是它左边却是还有长度为6的有效子串
              因此，这个思路不行

              相反，栈里直接存放一个-1  匹配到索引为5的右括号，这时候栈里最后一个左括号
              弹出，剩下一个-1.所以长度为6，然后遇到索引为6的右括号，这时候又要弹出一个元素
              但是栈里元素为空，所以索引6推入栈
              (() 
              -1 0  
            */
      var longestValidParentheses = function (s) {
        let stack = [-1]
        let maxLength = 0
        for (let i = 0; i < s.length; i++) {
          if (s[i] == '(') {
            stack.push(i)
          } else {
            //遇到右括号就出栈
            stack.pop()
            if (stack.length) {
              let temp = i - stack[stack.length - 1]
              maxLength = Math.max(temp, maxLength)
            } else {
              //重新放入起点
              stack.push(i)
            }
          }
        }
        return maxLength
      }
      longestValidParentheses()
    </script>
  </body>
</html>
